<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en-US">
<head>
<!-- GenHTML revision 25226-->
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>The billpayment Example: Using Events and Interceptors - The Java EE 6 Tutorial</title>
<meta name="robots" content="index,follow">
<meta name="robots" content="index,follow">
<meta name="date" content="2011-03-01">
<link rel="stylesheet" type="text/css" href="css/default.css">
<link rel="stylesheet" type="text/css" href="css/ipg.css">
<link rel="stylesheet" type="text/css" href="css/javaeetutorial.css">
</head>

<body>

<table border="0" cellpadding="5" cellspacing="0" width="100%">
<tbody>
   <tr valign="top">
      <td width="400px"><p class="toc level1"><a href="docinfo.html">Document Information</a></p>
<p class="toc level1 tocsp"><a href="gexaf.html">Preface</a></p>
<p class="toc level1 tocsp"><a href="gfirp.html">Part&nbsp;I&nbsp;Introduction</a></p>
<p class="toc level2"><a href="bnaaw.html">1.&nbsp;&nbsp;Overview</a></p>
<p class="toc level2"><a href="gfiud.html">2.&nbsp;&nbsp;Using the Tutorial Examples</a></p>
<p class="toc level1 tocsp"><a href="bnadp.html">Part&nbsp;II&nbsp;The Web Tier</a></p>
<p class="toc level2"><a href="bnadr.html">3.&nbsp;&nbsp;Getting Started with Web Applications</a></p>
<p class="toc level2"><a href="bnaph.html">4.&nbsp;&nbsp;JavaServer Faces Technology</a></p>
<p class="toc level2"><a href="giepx.html">5.&nbsp;&nbsp;Introduction to Facelets</a></p>
<p class="toc level2"><a href="gjddd.html">6.&nbsp;&nbsp;Expression Language</a></p>
<p class="toc level2"><a href="bnaqz.html">7.&nbsp;&nbsp;Using JavaServer Faces Technology in Web Pages</a></p>
<p class="toc level2"><a href="gjcut.html">8.&nbsp;&nbsp;Using Converters, Listeners, and Validators</a></p>
<p class="toc level2"><a href="bnatx.html">9.&nbsp;&nbsp;Developing with JavaServer Faces Technology</a></p>
<p class="toc level2"><a href="gkmaa.html">10.&nbsp;&nbsp;JavaServer Faces Technology Advanced Concepts</a></p>
<p class="toc level2"><a href="bnawo.html">11.&nbsp;&nbsp;Configuring JavaServer Faces Applications</a></p>
<p class="toc level2"><a href="gkiow.html">12.&nbsp;&nbsp;Using Ajax with JavaServer Faces Technology</a></p>
<p class="toc level2"><a href="gkhxa.html">13.&nbsp;&nbsp;Advanced Composite Components</a></p>
<p class="toc level2"><a href="bnavg.html">14.&nbsp;&nbsp;Creating Custom UI Components</a></p>
<p class="toc level2"><a href="bnafd.html">15.&nbsp;&nbsp;Java Servlet Technology</a></p>
<p class="toc level2"><a href="bnaxu.html">16.&nbsp;&nbsp;Internationalizing and Localizing Web Applications</a></p>
<p class="toc level1 tocsp"><a href="bnayk.html">Part&nbsp;III&nbsp;Web Services</a></p>
<p class="toc level2"><a href="gijti.html">17.&nbsp;&nbsp;Introduction to Web Services</a></p>
<p class="toc level2"><a href="bnayl.html">18.&nbsp;&nbsp;Building Web Services with JAX-WS</a></p>
<p class="toc level2"><a href="giepu.html">19.&nbsp;&nbsp;Building RESTful Web Services with JAX-RS</a></p>
<p class="toc level2"><a href="gjjxe.html">20.&nbsp;&nbsp;Advanced JAX-RS Features</a></p>
<p class="toc level2"><a href="gkojl.html">21.&nbsp;&nbsp;Running the Advanced JAX-RS Example Application</a></p>
<p class="toc level1 tocsp"><a href="bnblr.html">Part&nbsp;IV&nbsp;Enterprise Beans</a></p>
<p class="toc level2"><a href="gijsz.html">22.&nbsp;&nbsp;Enterprise Beans</a></p>
<p class="toc level2"><a href="gijre.html">23.&nbsp;&nbsp;Getting Started with Enterprise Beans</a></p>
<p class="toc level2"><a href="gijrb.html">24.&nbsp;&nbsp;Running the Enterprise Bean Examples</a></p>
<p class="toc level2"><a href="bnbpk.html">25.&nbsp;&nbsp;A Message-Driven Bean Example</a></p>
<p class="toc level2"><a href="gkcqz.html">26.&nbsp;&nbsp;Using the Embedded Enterprise Bean Container</a></p>
<p class="toc level2"><a href="gkidz.html">27.&nbsp;&nbsp;Using Asynchronous Method Invocation in Session Beans</a></p>
<p class="toc level1 tocsp"><a href="gjbnr.html">Part&nbsp;V&nbsp;Contexts and Dependency Injection for the Java EE Platform</a></p>
<p class="toc level2"><a href="giwhb.html">28.&nbsp;&nbsp;Introduction to Contexts and Dependency Injection for the Java EE Platform</a></p>
<p class="toc level2"><a href="gjbls.html">29.&nbsp;&nbsp;Running the Basic Contexts and Dependency Injection Examples</a></p>
<p class="toc level2"><a href="gjehi.html">30.&nbsp;&nbsp;Contexts and Dependency Injection for the Java EE Platform: Advanced Topics</a></p>
<p class="toc level2"><a href="gkhre.html">31.&nbsp;&nbsp;Running the Advanced Contexts and Dependency Injection Examples</a></p>
<p class="toc level3"><a href="gkhpu.html">The <tt>encoder</tt> Example: Using Alternatives</a></p>
<p class="toc level4"><a href="gkhpu.html#gkhqa">The <tt>Coder</tt> Interface and Implementations</a></p>
<p class="toc level4"><a href="gkhpu.html#gkhpm">The <tt>encoder</tt> Facelets Page and Managed Bean</a></p>
<p class="toc level4"><a href="gkhpu.html#gkhqq">Building, Packaging, Deploying, and Running the <tt>encoder</tt> Example</a></p>
<p class="toc level5"><a href="gkhpu.html#gkhow">To Build, Package, and Deploy the <tt>encoder</tt> Example Using NetBeans IDE</a></p>
<p class="toc level5"><a href="gkhpu.html#gkhqu">To Run the <tt>encoder</tt> Example Using NetBeans IDE</a></p>
<p class="toc level5"><a href="gkhpu.html#gkhql">To Build, Package, and Deploy the <tt>encoder</tt> Example Using Ant</a></p>
<p class="toc level5"><a href="gkhpu.html#gkhol">To Run the <tt>encoder</tt> Example Using Ant</a></p>
<p class="toc level3 tocsp"><a href="gkhpy.html">The <tt>producermethods</tt> Example: Using a Producer Method To Choose a Bean Implementation</a></p>
<p class="toc level4"><a href="gkhpy.html#gkhro">Components of the <tt>producermethods</tt> Example</a></p>
<p class="toc level4"><a href="gkhpy.html#gkhqe">Building, Packaging, Deploying, and Running the <tt>producermethods</tt> Example</a></p>
<p class="toc level5"><a href="gkhpy.html#gkhpe">To Build, Package, and Deploy the <tt>producermethods</tt> Example Using NetBeans IDE</a></p>
<p class="toc level5"><a href="gkhpy.html#gkhps">To Build, Package, and Deploy the <tt>producermethods</tt> Example Using Ant</a></p>
<p class="toc level5"><a href="gkhpy.html#gkhqg">To Run the <tt>producermethods</tt> Example</a></p>
<p class="toc level3 tocsp"><a href="gkhrg.html">The <tt>producerfields</tt> Example: Using Producer Fields to Generate Resources</a></p>
<p class="toc level4"><a href="gkhrg.html#gkhpp">The Producer Field for the <tt>producerfields</tt> Example</a></p>
<p class="toc level4"><a href="gkhrg.html#gkhpd">The <tt>producerfields</tt> Entity and Session Bean</a></p>
<p class="toc level4"><a href="gkhrg.html#gkhpf">The <tt>producerfields</tt> Facelets Pages and Managed Bean</a></p>
<p class="toc level4"><a href="gkhrg.html#gkhrh">Building, Packaging, Deploying, and Running the <tt>producerfields</tt> Example</a></p>
<p class="toc level5"><a href="gkhrg.html#gkhpb">To Build, Package, and Deploy the <tt>producerfields</tt> Example Using NetBeans IDE</a></p>
<p class="toc level5"><a href="gkhrg.html#gkhrm">To Build, Package, and Deploy the <tt>producerfields</tt> Example Using Ant</a></p>
<p class="toc level5"><a href="gkhrg.html#gkhrr">To Run the <tt>producerfields</tt> Example</a></p>
<div id="scrolltoc" class="onpage">
<p class="toc level3 tocsp"><a href="">The <tt>billpayment</tt> Example: Using Events and Interceptors</a></p>
<p class="toc level4"><a href="#gkhok">The <tt>PaymentEvent</tt> Event Class</a></p>
<p class="toc level4"><a href="#gkhrb">The <tt>PaymentHandler</tt> Event Listener</a></p>
<p class="toc level4"><a href="#gkhrj">The <tt>billpayment</tt> Facelets Pages and Managed Bean</a></p>
<p class="toc level4"><a href="#gkhrq">The <tt>LoggedInterceptor</tt> Interceptor Class</a></p>
<p class="toc level4"><a href="#gkhpk">Building, Packaging, Deploying, and Running the <tt>billpayment</tt> Example</a></p>
<p class="toc level5"><a href="#gkhqs">To Build, Package, and Deploy the <tt>billpayment</tt> Example Using NetBeans IDE</a></p>
<p class="toc level5"><a href="#gkhpx">To Build, Package, and Deploy the <tt>billpayment</tt> Example Using Ant</a></p>
<p class="toc level5"><a href="#gkhpt">To Run the <tt>billpayment</tt> Example</a></p>
</div>
<p class="toc level3 tocsp"><a href="gkpax.html">The <tt>decorators</tt> Example: Decorating a Bean</a></p>
<p class="toc level4"><a href="gkpax.html#gkpaq">Components of the <tt>decorators</tt> Example</a></p>
<p class="toc level4"><a href="gkpax.html#gkpbk">Building, Packaging, Deploying, and Running the <tt>decorators</tt> Example</a></p>
<p class="toc level5"><a href="gkpax.html#gkpag">To Build, Package, and Deploy the <tt>decorators</tt> Example Using NetBeans IDE</a></p>
<p class="toc level5"><a href="gkpax.html#gkpaj">To Build, Package, and Deploy the <tt>decorators</tt> Example Using Ant</a></p>
<p class="toc level5"><a href="gkpax.html#gkpan">To Run the <tt>decorators</tt> Example</a></p>
<p class="toc level1 tocsp"><a href="bnbpy.html">Part&nbsp;VI&nbsp;Persistence</a></p>
<p class="toc level2"><a href="bnbpz.html">32.&nbsp;&nbsp;Introduction to the Java Persistence API</a></p>
<p class="toc level2"><a href="gijst.html">33.&nbsp;&nbsp;Running the Persistence Examples</a></p>
<p class="toc level2"><a href="bnbtg.html">34.&nbsp;&nbsp;The Java Persistence Query Language</a></p>
<p class="toc level2"><a href="gjitv.html">35.&nbsp;&nbsp;Using the Criteria API to Create Queries</a></p>
<p class="toc level2"><a href="gkjiq.html">36.&nbsp;&nbsp;Creating and Using String-Based Criteria Queries</a></p>
<p class="toc level2"><a href="gkjjf.html">37.&nbsp;&nbsp;Controlling Concurrent Access to Entity Data with Locking</a></p>
<p class="toc level2"><a href="gkjia.html">38.&nbsp;&nbsp;Improving the Performance of Java Persistence API Applications By Setting a Second-Level Cache</a></p>
<p class="toc level1 tocsp"><a href="gijrp.html">Part&nbsp;VII&nbsp;Security</a></p>
<p class="toc level2"><a href="bnbwj.html">39.&nbsp;&nbsp;Introduction to Security in the Java EE Platform</a></p>
<p class="toc level2"><a href="bncas.html">40.&nbsp;&nbsp;Getting Started Securing Web Applications</a></p>
<p class="toc level2"><a href="bnbyk.html">41.&nbsp;&nbsp;Getting Started Securing Enterprise Applications</a></p>
<p class="toc level1 tocsp"><a href="gijue.html">Part&nbsp;VIII&nbsp;Java EE Supporting Technologies</a></p>
<p class="toc level2"><a href="gijto.html">42.&nbsp;&nbsp;Introduction to Java EE Supporting Technologies</a></p>
<p class="toc level2"><a href="bncih.html">43.&nbsp;&nbsp;Transactions</a></p>
<p class="toc level2"><a href="bncjh.html">44.&nbsp;&nbsp;Resource Connections</a></p>
<p class="toc level2"><a href="bncdq.html">45.&nbsp;&nbsp;Java Message Service Concepts</a></p>
<p class="toc level2"><a href="bncgv.html">46.&nbsp;&nbsp;Java Message Service Examples</a></p>
<p class="toc level2"><a href="gkahp.html">47.&nbsp;&nbsp;Advanced Bean Validation Concepts and Examples</a></p>
<p class="toc level2"><a href="gkeed.html">48.&nbsp;&nbsp;Using Java EE Interceptors</a></p>
<p class="toc level1 tocsp"><a href="gkgjw.html">Part&nbsp;IX&nbsp;Case Studies</a></p>
<p class="toc level2"><a href="gkaee.html">49.&nbsp;&nbsp;Duke's Tutoring Case Study Example</a></p>
<p class="toc level1 tocsp"><a href="idx-1.html">Index</a></p>
</td>
      <td width="10px">&nbsp;</td>
      <td>
         <div class="header">
             <div class="banner">
                <table width="100%" border="0" cellpadding="5" cellspacing="0">
                   <tbody>
                      <tr>
                         <td valign="bottom"><p class="Banner">The Java EE 6 Tutorial
</p></td>
                         <td align="right"  valign="bottom"><img src="graphics/javalogo.png" alt="Java Coffee Cup logo"></td>
                      </tr>
                   </tbody>
                </table>
             </div>

             <div class="header-links">
	         <a href="./index.html">Home</a> | 
<a href="../information/download.html">Download</a> | 
<a href="./javaeetutorial6.pdf">PDF</a> | 
<a href="../information/faq.html">FAQ</a> | 
<a href="http://download.oracle.com/javaee/feedback.htm">Feedback</a>

             </div>
             <div class="navigation">
                 <a href="gkhrg.html"><img src="graphics/leftButton.gif" border="0" alt="Previous" title="Previous"></a>
                 <a href="p1.html"><img src="graphics/upButton.gif" border="0" alt="Contents" title="Contents"></a>
                 <a href="gkpax.html"><img src="graphics/rightButton.gif" border="0" alt="Next" title="Next"></a>
             </div>
         </div>

	 <div class="maincontent">      	 
             

<a name="gkhpa"></a><h2>The <tt>billpayment</tt> Example: Using Events and Interceptors</h2>
<a name="indexterm-1588"></a><a name="indexterm-1589"></a><p>The <tt>billpayment</tt> example shows how to use both events and interceptors.</p>

<p>The example simulates paying an amount using a debit card or credit card.
When the user chooses a payment method, the managed bean creates an appropriate
event, supplies its payload, and fires it. A simple event listener handles the
event using observer methods.</p>

<p>The example also defines an interceptor that is set on a class
and on two methods of another class.</p>



<a name="gkhok"></a><h3>The <tt>PaymentEvent</tt> Event Class</h3>
<p>The event class, <tt>event.PaymentEvent</tt>, is a simple bean class that contains a no-argument
constructor. It also has a <tt>toString</tt> method and getter and setter methods
for the payload components: a <tt>String</tt> for the payment type, a <tt>BigDecimal</tt> for the
payment amount, and a <tt>Date</tt> for the time stamp.</p>

<pre>public class PaymentEvent implements Serializable {

    private static final long serialVersionUID = 1L;
    public String paymentType;
    public BigDecimal value;
    public Date datetime;

    public PaymentEvent() {
    }
    @Override
    public String toString() {
        return this.paymentType
                + " = $" + this.value.toString()
                + " at " + this.datetime.toString();
    }
    ...</pre><p>The event class is a simple bean that is instantiated by the
managed bean using <tt>new</tt> and then populated. For this reason, the CDI container cannot
intercept the creation of the bean, and hence it cannot allow interception of
its getter and setter methods.</p>



<a name="gkhrb"></a><h3>The <tt>PaymentHandler</tt> Event Listener</h3>
<p>The event listener, <tt>listener.PaymentHandler</tt>, contains two observer methods, one for each of the
two event types:</p>

<pre>@Logged
@SessionScoped
public class PaymentHandler implements Serializable {

    ...
    public void creditPayment(@Observes @Credit PaymentEvent event) {
        logger.log(Level.INFO, "PaymentHandler - Credit Handler: {0}",
                event.toString());

        // call a specific Credit handler class...
    }

    public void debitPayment(@Observes @Debit PaymentEvent event) {
        logger.log(Level.INFO, "PaymentHandler - Debit Handler: {0}",
                event.toString());
 
        // call a specific Debit handler class...
    }
}</pre><p>Each observer method takes as an argument the event, annotated with <tt>@Observes</tt>
and the qualifier for the type of payment. In a real application, the
observer methods would pass the event information on to another component that would
perform business logic on the payment.</p>

<p>The qualifiers are defined in the <tt>payment</tt> package, described in <a href="#gkhrj">The <tt>billpayment</tt> Facelets Pages and Managed Bean</a>.</p>

<p>Like <tt>PaymentEvent</tt>, the <tt>PaymentHandler</tt> bean is annotated <tt>@Logged</tt>, so that all its methods
can be intercepted.</p>



<a name="gkhrj"></a><h3>The <tt>billpayment</tt> Facelets Pages and Managed Bean</h3>
<p>The <tt>billpayment</tt> example contains two Facelets pages, <tt>index.xhtml</tt> and the very simple
<tt>response.xhtml</tt>. The body of <tt>index.xhtml</tt> looks like this:</p>

<pre>    &lt;h:body>
        &lt;h3>Bill Payment Options&lt;/h3>
        &lt;p>Type an amount, select Debit Card or Credit Card, then click Pay.&lt;/p>
        &lt;h:form>
            &lt;p>
            &lt;h:outputLabel value="Amount: $" for="amt"/>
            &lt;h:inputText id="amt" value="#{paymentBean.value}" required="true"
                         requiredMessage="An amount is required."
                         maxlength="15" />
            &lt;/p>
            &lt;h:outputLabel value="Options:" for="opt"/>
            &lt;h:selectOneRadio id="opt" value="#{paymentBean.paymentOption}">
                &lt;f:selectItem id="debit" itemLabel="Debit Card" itemValue="1"/>
                &lt;f:selectItem id="credit" itemLabel="Credit Card" itemValue="2" />
            &lt;/h:selectOneRadio>
            &lt;p>&lt;h:commandButton id="submit" value="Pay"
                                action="#{paymentBean.pay}" />&lt;/p>
            &lt;p>&lt;h:commandButton value="Reset" action="#{paymentBean.reset}" />&lt;/p>
        &lt;/h:form>
        ...
    &lt;/h:body></pre><p>The input text field takes a payment amount, passed to <tt>paymentBean.value</tt>. Two
radio buttons ask the user to select a Debit Card or Credit Card
payment, passing the integer value to <tt>paymentBean.paymentOption</tt>. Finally, the Pay command button's action
is set to the method <tt>paymentBean.pay</tt>, while the Reset button's action is
set to the <tt>paymentBean.reset</tt> method.</p>

<p>The <tt>payment.PaymentBean</tt> managed bean uses qualifiers to differentiate between the two kinds of
payment event:</p>

<pre>@Named
@SessionScoped
public class PaymentBean implements Serializable {

   ...
    @Inject
    @Credit
    Event&lt;PaymentEvent> creditEvent;

    @Inject
    @Debit
    Event&lt;PaymentEvent> debitEvent;</pre><p>The qualifiers, <tt>@Credit</tt> and <tt>@Debit</tt>, are defined in the <tt>payment</tt> package along with
<tt>PaymentBean</tt>.</p>

<p>Next, the <tt>PaymentBean</tt> defines the properties that it obtains from the Facelets page
and will pass on to the event:</p>

<pre>    public static final int DEBIT = 1;
    public static final int CREDIT = 2;
    private int paymentOption = DEBIT;
    
    @Digits(integer = 10, fraction = 2, message = "Invalid value")
    private BigDecimal value;

    private Date datetime;</pre><p>The <tt>paymentOption</tt> value is an integer passed in from the radio button component;
the default value is <tt>DEBIT</tt>. The <tt>value</tt> is a <tt>BigDecimal</tt> with a Bean Validation
constraint that enforces a currency value with a maximum number of digits. The
timestamp for the event, <tt>datetime</tt>, is a <tt>Date</tt> object that is initialized
when the <tt>pay</tt> method is called.</p>

<p>The <tt>pay</tt> method of the bean first sets the timestamp for this payment
event. It then creates and populates the event payload, using the constructor for
the <tt>PaymentEvent</tt> and calling the event's setter methods using the bean properties as
arguments. It then fires the event.</p>

<pre>    @Logged
    public String pay() {
        this.setDatetime(Calendar.getInstance().getTime());
        switch (paymentOption) {
            case DEBIT:
                PaymentEvent debitPayload = new PaymentEvent();
                debitPayload.setPaymentType("Debit");
                debitPayload.setValue(value);
                debitPayload.setDatetime(datetime);
                debitEvent.fire(debitPayload);
                break;
            case CREDIT:
                PaymentEvent creditPayload = new PaymentEvent();
                creditPayload.setPaymentType("Credit");
                creditPayload.setValue(value);
                creditPayload.setDatetime(datetime);
                creditEvent.fire(creditPayload);
                break;
            default:
                logger.severe("Invalid payment option!");
        }
        return "/response.xhtml";
    }</pre><p>The <tt>pay</tt> method returns the page to which the action is redirected, <tt>response.xhtml</tt>.</p>

<p>The <tt>PaymentBean</tt> class also contains a <tt>reset</tt> method that empties the value
field on the <tt>index.xhtml</tt> page and sets the payment option to the default:</p>

<pre>    @Logged
    public void reset() {
        setPaymentOption(DEBIT);
        setValue(BigDecimal.ZERO);
    }</pre><p>In this bean, only the <tt>pay</tt> and <tt>reset</tt> methods are intercepted.</p>

<p>The <tt>response.xhtml</tt> page displays the amount paid. It uses a <tt>rendered</tt> expression to
display the payment method:</p>

<pre>    &lt;h:body>
        &lt;h:form>
            &lt;h2>Bill Payment: Result&lt;/h2>
            &lt;h3>Amount Paid with
                &lt;h:outputText id="debit" value="Debit Card: "
                              rendered="#{paymentBean.paymentOption eq 1}" />
                &lt;h:outputText id="credit" value="Credit Card: "
                              rendered="#{paymentBean.paymentOption eq 2}" />
                &lt;h:outputText id="result" value="#{paymentBean.value}" >
                    &lt;f:convertNumber type="currency"/>
                &lt;/h:outputText>
            &lt;/h3>
            &lt;p>&lt;h:commandButton id="back" value="Back" action="index" />&lt;/p>
        &lt;/h:form>
    &lt;/h:body></pre>

<a name="gkhrq"></a><h3>The <tt>LoggedInterceptor</tt> Interceptor Class</h3>
<p>The interceptor class, <tt>LoggedInterceptor</tt>, and its interceptor binding, <tt>Logged</tt>, are both defined in
the <tt>interceptor</tt> package. The <tt>Logged</tt> interceptor binding is defined as follows:</p>

<pre>@Inherited
@InterceptorBinding
@Retention(RUNTIME)
@Target({METHOD, TYPE})
public @interface Logged {
}</pre><p>The <tt>LoggedInterceptor</tt> class looks like this:</p>

<pre>@Logged
@Interceptor
public class LoggedInterceptor implements Serializable {

    private static final long serialVersionUID = 1L;

    public LoggedInterceptor() {
    }

    @AroundInvoke
    public Object logMethodEntry(InvocationContext invocationContext)
            throws Exception {
        System.out.println("Entering method: "
                + invocationContext.getMethod().getName() + " in class "
                + invocationContext.getMethod().getDeclaringClass().getName());

        return invocationContext.proceed();
    }
}</pre><p>The class is annotated with both the <tt>@Logged</tt> and the <tt>@Interceptor</tt> annotations. The
<tt>@AroundInvoke</tt> method, <tt>logMethodEntry</tt>, takes the required <tt>InvocationContext</tt> argument, and calls the required <tt>proceed</tt>
method. When a method is intercepted, <tt>logMethodEntry</tt> displays the name of the method being
invoked as well as its class.</p>

<p>To enable the interceptor, the <tt>beans.xml</tt> file defines it as follows:</p>

<pre>&lt;interceptors>
    &lt;class>billpayment.interceptor.LoggedInterceptor&lt;/class>
&lt;/interceptors></pre><p>In this application, the <tt>PaymentEvent</tt> and <tt>PaymentHandler</tt> classes are annotated <tt>@Logged</tt>, so that
all their methods are intercepted. In <tt>PaymentBean</tt>, only the <tt>pay</tt> and <tt>reset</tt> methods are
annotated  <tt>@Logged</tt>, so only those methods are intercepted.</p>



<a name="gkhpk"></a><h3>Building, Packaging, Deploying, and Running the <tt>billpayment</tt> Example</h3>
<p>You can build, package, deploy, and run the <tt>billpayment</tt> application by using either
NetBeans IDE or the Ant tool.</p>



<a name="gkhqs"></a><h4>To Build, Package, and Deploy the <tt>billpayment</tt> Example Using NetBeans IDE</h4>
<ol>
<li><b>From the File menu, choose Open Project.</b></li>
<li><b>In the Open Project dialog, navigate to:</b><pre><tt></tt><i>tut-install</i><tt>/examples/cdi/</tt></pre></li>
<li><b>Select the <tt>billpayment</tt> folder.</b></li>
<li><b>Select the Open as Main Project check box.</b></li>
<li><b>Click Open Project.</b></li>
<li><b>In the Projects tab, right-click the <tt>billpayment</tt> project and select Deploy.</b></li></ol>

<a name="gkhpx"></a><h4>To Build, Package, and Deploy the <tt>billpayment</tt> Example Using Ant</h4>
<ol>
<li><b>In a terminal window, go to:</b><pre><i>tut-install</i>/examples/cdi/billpayment/</pre></li>
<li><b>Type the following command:</b><pre><tt><b>ant</b></tt></pre><p>This command calls the <tt>default</tt> target, which builds and packages the application into
a WAR file, <tt>billpayment.war</tt>, located in the <tt>dist</tt> directory.</p></li>
<li><b>Type the following command:</b><pre><tt><b>ant deploy</b></tt></pre></li></ol>

<a name="gkhpt"></a><h4>To Run the <tt>billpayment</tt> Example</h4>
<ol>
<li><b>In a web browser, type the following URL:</b><pre>http://localhost:8080/billpayment</pre><p>The Bill Payment Options page opens.</p></li>
<li><b>Type a value in the Amount field.</b><p>The amount can contain up to 10 digits and include up to 2
decimal places. For example:</p><pre><tt><b>9876.54</b></tt></pre></li>
<li><b>Select Debit Card or Credit Card and click Pay.</b><p>The Bill Payment: Result page opens, displaying the amount paid and the method of
payment:</p><pre>Amount Paid with Credit Card: $9,876.34</pre></li>
<li>(Optional) <b>Click Back to return to the Bill Payment Options page.</b><p>You can also click Reset to return to the initial page values.</p></li>
<li><b>Examine the server log output.</b><p>In NetBeans IDE, the output is visible in the GlassFish Server 3.1.1 output
window. Otherwise, view <tt></tt><i>domain-dir</i><tt>/logs/server.log</tt>.</p><p>The output from each interceptor appears in the log, followed by the additional
logger output defined by the constructor and methods:</p><pre>INFO: Entering method: pay in class billpayment.payment.PaymentBean
INFO: PaymentHandler created.
INFO: PaymentHandler created.
INFO: PaymentHandler created.
INFO: Entering method: debitPayment in class billpayment.listener.PaymentHandler
INFO: PaymentHandler - Debit Handler: Debit = $1234.56 at Tue Dec 14 14:50:28 EST 2010</pre></li></ol>
         </div>
         <div class="navigation">
             <a href="gkhrg.html"><img src="graphics/leftButton.gif" border="0" alt="Previous" title="Previous"></a>
             <a href="p1.html"><img src="graphics/upButton.gif" border="0" alt="Contents" title="Contents"></a>
             <a href="gkpax.html"><img src="graphics/rightButton.gif" border="0" alt="Next" title="Next"></a>
         </div>

         <div class="copyright">
      	    <p>Copyright &copy; 2011, Oracle and/or its affiliates. All rights reserved. <a href="docinfo.html">Legal Notices</a></p>
      	 </div>

      </td>
   </tr>
</tbody>
</table>
</body>
</html>

